package com.it.Advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Arrays;
/*
* 【说明】：使用环绕通知对AOP进行封装
* */
@Aspect
@Component
public class LogAdbiceSurround {
    // 提前切入表达式，封装调用
    @Pointcut("execution(* *..*.*(..))") // 表示 任意修饰符 任意返回值 任意路径 任意方法名(任意参数)
    public void pointCut() {  } // 必须加方法体
    /*
     * 环绕通知
     * 【说明】：如果确定对目标方法的前、返回、异常。后通知都要做通知
     *         环绕通知实际上就是对以上四种通知做的整合
     *         ProceedingJoinPoint是JoinPoint子接口
     *
     **/
    @Around("pointCut()")
    public Object aroundLog(ProceedingJoinPoint point) {
        String name = point.getSignature().getName(); // 获取目标对象方法名
        Object[] args = point.getArgs();             // 获取目标对象参数
        System.out.println(name + "【前置通知】参数：" + Arrays.toString(args));
        // 执行目标方法、并返回目标方法执行后的结果
        Object res = null;
        try {
            res = point.proceed();
            System.out.println(name + "【返回通知】参数：" + Arrays.toString(args));
            System.out.println(name + "【返回通知】结果：" + res);
        } catch (Throwable e) {
            System.out.println(name + "：【异常通知】出现异常，原因是：" + e.getMessage());
        } finally {
            System.out.println(name + "：【最终通知】");
        }
        return res;
    }
}
